package _79

import (
	"sort"
)

/*
时间复杂度：O(logNum * log(logNum)) 其实就是对num中所有数字进行排序,需要NlogN的时间,这里的N对应的是num的位数
空间复杂度：O(logNum) 存储num各个位上的数字

negative  美 [ˈneɡətɪv] 负数
positive 美 [ˈpɑːzətɪv] 正数
*/

func smallestNumber(num int64) int64 {
	var positive bool
	if num >= 0 {
		positive = true
	} else {
		num = - num
	}

	arr := make([]int, 0)
	for num > 0 {
		posNum := int(num % 10)
		arr = append(arr, posNum)
		num /= 10
	}

	var result int64
	if positive {
		// 如果是正数,则要避免出现前导0,且尽量使较小的数放置到最高位
		sort.Slice(arr, func(i, j int) bool {
			return arr[i] < arr[j]
		})
		for i, v := range arr {
			if v != 0 {
				arr[0], arr[i] = arr[i], arr[0]
				break
			}
		}
	} else {
		sort.Slice(arr, func(i, j int) bool {
			return arr[i] > arr[j]
		})
	}

	for _, v := range arr {
		result = result*10 + int64(v)
	}
	if positive {
		return result
	}
	return -result
}
